package com.lottery.material.service.admin.conf.impl;

import com.lottery.material.common.Constants;
import com.lottery.material.dao.conf.MenuLevelConfigMapper;
import com.lottery.material.enumeration.common.CommonEnum;
import com.lottery.material.enumeration.conf.MenuLevelConfigEnum;
import com.lottery.material.pojo.conf.MenuLevelConfig;
import com.lottery.material.pojo.page.Page;
import com.lottery.material.pojocustom.conf.MenuLevelConfigCustom;
import com.lottery.material.service.admin.circle.CircleInfoService;
import com.lottery.material.service.admin.conf.MenuLevelConfigService;
import com.lottery.material.util.AssertUtil;
import com.lottery.material.util.CalendarUtil;
import com.lottery.material.util.EnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * Description：类别配置服务接口实现类
 * Created by 朱正磊 on 2019-04-13 17:04
 */
@Service("adminMenuLevelConfigService")
public class MenuLevelConfigServiceImpl implements MenuLevelConfigService {

    private final MenuLevelConfigMapper menuLevelConfigMapper;

    private final CircleInfoService circleInfoService;

    @Autowired
    public MenuLevelConfigServiceImpl(MenuLevelConfigMapper menuLevelConfigMapper,
                                      CircleInfoService circleInfoService) {
        this.menuLevelConfigMapper = menuLevelConfigMapper;
        this.circleInfoService = circleInfoService;
    }

    /**
     * description：新增一条数据（一级类别）
     * user 朱正磊
     * time 2019-04-17 17:06
     * @param menuLevelConfig 对象
     * @return 返回持久化操作数据库状态值
     */
    @Override
    public Integer addOne(MenuLevelConfig menuLevelConfig) {
        menuLevelConfig.setCreateTime(new Date());
        menuLevelConfig.setState((Integer) CommonEnum.STATE_OFF.getValue()); //默认下架
        menuLevelConfig.setLevelType((Integer) MenuLevelConfigEnum.LEVEL_TYPE_ONE.getValue());
        menuLevelConfig.setParentId(0); // 父类别设置为0
        if (Objects.equals(menuLevelConfig.getIsCircleMenu(), MenuLevelConfigEnum.IS_CIRCLE_MENU_FALSE.getValue())) { // 不属于圈子菜单
            // 加入到模块
            menuLevelConfig.setIsJoinModule((Integer) MenuLevelConfigEnum.IS_JOIN_MODULE_TRUE.getValue());
            // 不设置热帖
            menuLevelConfig.setIsSetHot((Integer) MenuLevelConfigEnum.IS_SET_HOT_FALSE.getValue());
        }
        return menuLevelConfigMapper.insertSelective(menuLevelConfig);
    }

    /**
     * description：新增一条数据（二级类别）
     * user 朱正磊
     * time 2019-04-17 17:06
     * @param menuLevelConfig 对象
     * @return 返回持久化操作数据库状态值
     */
    @Override
    public Integer addTwo(MenuLevelConfig menuLevelConfig) {
        menuLevelConfig.setCreateTime(new Date());
        menuLevelConfig.setState((Integer) CommonEnum.STATE_OFF.getValue()); //默认下架
        menuLevelConfig.setLevelType((Integer) MenuLevelConfigEnum.LEVEL_TYPE_TWO.getValue());
        Integer parentId = menuLevelConfig.getParentId();
        if (AssertUtil.isEmpty(parentId)) { //如果没有父类别
            menuLevelConfig.setIsCircleMenu((Integer) MenuLevelConfigEnum.IS_CIRCLE_MENU_FALSE.getValue());
        } else { //如果有父类别
            menuLevelConfig.setIsCircleMenu((Integer) MenuLevelConfigEnum.IS_CIRCLE_MENU_TRUE.getValue());
        }
        return menuLevelConfigMapper.insertSelective(menuLevelConfig);
    }

    /**
     * description：根据主键物理删除
     * user 朱正磊
     * time 2019-04-20 15:13
     * @param id 主键
     * @return 返回持久化操作数据库状态值
     */
    @Override
    public Integer deleteById(Integer id) {
        return menuLevelConfigMapper.deleteByPrimaryKey(id);
    }

    /**
     * description：根据主键查询唯一数据
     * user 朱正磊
     * time 2019-04-19 20:11
     * @param id 主键
     * @return 返回唯一数据
     */
    @Override
    public MenuLevelConfig findById(Integer id) {
        return menuLevelConfigMapper.selectByPrimaryKey(id);
    }

    /**
     * description：根据主键修改一条数据
     * user 朱正磊
     * time 2019-04-17 17:09
     * @param menuLevelConfig 对象
     * @return 返回持久化操作数据库状态值
     */
    @Override
    public Integer updateById(MenuLevelConfig menuLevelConfig) {
        Integer levelType = menuLevelConfig.getLevelType();
        if (Objects.equals(levelType, MenuLevelConfigEnum.LEVEL_TYPE_TWO.getValue())) { //二级类别
            Integer parentId = menuLevelConfig.getParentId();
            if (AssertUtil.isEmpty(parentId)) { //如果没有父类别
                menuLevelConfig.setIsCircleMenu((Integer) MenuLevelConfigEnum.IS_CIRCLE_MENU_FALSE.getValue());
            } else { //如果有父类别
                menuLevelConfig.setIsCircleMenu((Integer) MenuLevelConfigEnum.IS_CIRCLE_MENU_TRUE.getValue());
            }
        } else { //一级类别
            menuLevelConfig.setParentId(0); //防止被修改成null
        }
        return menuLevelConfigMapper.updateByPrimaryKeySelective(menuLevelConfig);
    }

    /**
     * description：查询扩展类分页列表（一级类别）
     * user 朱正磊
     * time 2019-04-17 17:01
     * @param page 分页对象
     * @return 返回扩展类分页列表数据
     */
    @Override
    public List<MenuLevelConfigCustom> findOneCustomListPage(Page page) {
        List<MenuLevelConfigCustom> list = menuLevelConfigMapper.findOneCustomListPage(page);
        list.forEach(this::setCustom);
        return list;
    }

    /**
     * description：查询扩展类分页列表（二级类别）
     * user 朱正磊
     * time 2019-04-17 17:01
     * @param page 分页对象
     * @return 返回扩展类分页列表数据
     */
    @Override
    public List<MenuLevelConfigCustom> findTwoCustomListPage(Page page) {
        List<MenuLevelConfigCustom> list = menuLevelConfigMapper.findTwoCustomListPage(page);
        list.forEach(this::setCustom);
        return list;
    }

    /**
     * description：根据主键查询唯一扩展类数据
     * user 朱正磊
     * time 2019-04-17 17:03
     * @param id 主键
     * @return 返回唯一扩展类数据
     */
    @Override
    public MenuLevelConfigCustom findCustomById(Integer id) {
        MenuLevelConfigCustom custom = menuLevelConfigMapper.findCustomById(id);
        this.setCustom(custom);
        return custom;
    }

    /**
     * description：设置扩展类的扩展属性
     * user 朱正磊
     * time 2019-04-17 17:48
     * @param custom 扩展类对象
     */
    private void setCustom(MenuLevelConfigCustom custom) {
        //创建时间
        custom.setCreateTimeFormat(CalendarUtil.dateToString(custom.getCreateTime()));
        //是否属于圈子菜单（1：否；2：是）
        custom.setIsCircleMenuDesc(EnumUtil.getDescriptionByCodeValue(MenuLevelConfigEnum.IS_CIRCLE_MENU,
                custom.getIsCircleMenu(), MenuLevelConfigEnum.class));
        //是否加入到模块，只针对一级菜单（1：否；2：是）
        custom.setIsJoinModuleDesc(EnumUtil.getDescriptionByCodeValue(MenuLevelConfigEnum.IS_JOIN_MODULE,
                custom.getIsJoinModule(), MenuLevelConfigEnum.class));
        //是否设置热贴，只针对一级菜单（1：否；2：是）
        custom.setIsSetHotDesc(EnumUtil.getDescriptionByCodeValue(MenuLevelConfigEnum.IS_SET_HOT,
                custom.getIsSetHot(), MenuLevelConfigEnum.class));
        //状态（1：上架；2：下架）
        custom.setStateDesc(EnumUtil.getDescriptionByCodeValue(CommonEnum.STATE,
                custom.getState(), CommonEnum.class));
        //父菜单名称
        MenuLevelConfig parent = this.findById(custom.getParentId());
        if (AssertUtil.isNotEmpty(parent)) {
            custom.setParentName(parent.getMenuName());
        }
    }

    /**
     * description：根据所属类别查询类别配置列表
     * user 朱正磊
     * time 2019-05-21 16:59
     * @param levelType 当前所属类别
     * @return 返回类别配置列表
     */
    @Override
    public List<MenuLevelConfig> findByLevelType(Integer levelType) {
        return menuLevelConfigMapper.findByLevelType(levelType);
    }

    /**
     * description：生成类别编号
     * user 朱正磊
     * time 2019-04-19 17:33
     * @param levelType 当前所属级别（1：一级类别；2：二级类别）
     * @return 返回类别编号
     */
    public String genMenuCode(Integer levelType) {
        String maxMenuCode = menuLevelConfigMapper.findMaxMenuCode(levelType);
        String serialNo;
        String menuCode;
        if (AssertUtil.isEmpty(maxMenuCode)) {
            serialNo = "00001";
        } else {
            String maxSerialNo = maxMenuCode.substring(3);
            serialNo = String.format("%05d", Integer.valueOf(maxSerialNo) + 1);
        }
        if (Objects.equals(levelType, MenuLevelConfigEnum.LEVEL_TYPE_ONE.getValue())) {
            menuCode = Constants.ONE_LEVEL_PREFIX + serialNo;
        } else {
            menuCode = Constants.TWO_LEVEL_PREFIX + serialNo;
        }
        return menuCode;
    }

    /**
     * description：根据类别编号查询类别名称
     * user 朱正磊
     * time 2019-04-22 10:35
     * @param menuCode 类别编号
     * @return 返回类别名称
     */
    public String findMenuNameByMenuCode(String menuCode) {
        return menuLevelConfigMapper.findMenuNameByMenuCode(menuCode);
    }

    /**
     * description：根据所属级别和状态以及是否属于圈子菜单查询类别列表（主要是针对一级类别）
     * user 朱正磊
     * time 2019-04-23 10:27
     * @param levelType 当前所属级别（1：一级类别；2：二级类别）
     * @param state 状态（1：上架；2：下架）
     * @param isCircleMenu 是否属于圈子菜单（1：否；2：是）
     * @return 返回类别列表
     */
    @Override
    public List<MenuLevelConfig> findByLevelTypeAndState(Integer levelType, Integer state, Integer isCircleMenu) {
        return menuLevelConfigMapper.findByLevelTypeAndState(levelType, state, isCircleMenu);
    }

    /**
     * description：根据父类ID和状态查询类别列表（二级类别）
     * user 朱正磊
     * time 2019-04-23 10:38
     * @param parentId 父类ID
     * @param state 状态（1：上架；2：下架）
     * @return 返回类别列表
     */
    @Override
    public List<MenuLevelConfig> findByParentIdAndState(Integer parentId, Integer state) {
        return menuLevelConfigMapper.findByParentIdAndState(parentId, state);
    }

    /**
     * description：根据类别编号查询类别对象
     * user 朱正磊
     * time 2019-04-23 10:46
     * @param menuCode 类别编号
     * @return 返回类别对象
     */
    @Override
    public MenuLevelConfig findByMenuCode(String menuCode) {
        return menuLevelConfigMapper.findByMenuCode(menuCode);
    }

    /**
     * description：更新一级类别下的二级类别的上下架状态（用来下架）
     * user 朱正磊
     * time 2019-04-23 17:42
     * @param parentId 一级类别ID
     * @return 返回持久化操作数据库状态值
     */
    @Override
    public Integer updateStateByParentId(Integer parentId) {
        //查询一级类别下的所有未下架的二级类别
        List<MenuLevelConfig> list = menuLevelConfigMapper.
                findByParentIdAndState(parentId, (Integer) CommonEnum.STATE_ON.getValue());
        Integer flag = 1;
        for (MenuLevelConfig menuLevelConfig : list) {
            menuLevelConfig.setState((Integer) CommonEnum.STATE_OFF.getValue()); //进行下架一级类别下的二级类别
            flag = menuLevelConfigMapper.updateByPrimaryKeySelective(menuLevelConfig);
            if (Objects.equals(flag, 0)) {
                break;
            }
            flag = circleInfoService.updateBySubTypeCode(menuLevelConfig.getMenuCode()); //进行下架二级类别下的圈子
            if (Objects.equals(flag, 0)) {
                break;
            }
        }
        return flag;
    }

    /**
     * description：根据类别名称查询类别列表（可以不存在，如果存在只允许存在一条数据）
     * user 朱正磊
     * time 2019-04-25 15:37
     * @param menuName 类别名称
     * @return 返回类别列表
     */
    @Override
    public List<MenuLevelConfig> findByMenuName(String menuName) {
        return menuLevelConfigMapper.findByMenuName(menuName);
    }

}
